﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace Core.ReadAndWrite
{
    public class DataSource
    {

        /// <summary>
        /// Singleton
        /// </summary>

        private static DataSource _Instance;
        private static object locks = new object();

        public static DataSource Instance
        {
            get
            {
                if (_Instance == null)
                {
                    lock (locks)
                    {
                        if (_Instance == null)
                            _Instance = new DataSource();
                    }
                }
                return _Instance;
            }
        }
        public List<BaseData> ReadLopHoc(string path)
        {
            try
            {
                if (!File.Exists(path))
                    File.Create(path);

                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    LopHoc temp = new LopHoc
                    {
                        MaLop = parts[0],
                        TenLop = parts[1],
                        SiSo = int.Parse(parts[2]),
                        MaKhoa = int.Parse(parts[3])

                    };
                    resurt.Add(temp);
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {
                return new List<BaseData>();

            }

        }

        public List<BaseData> ReadKhoa(string path)
        {
            try
            {
                if (!File.Exists(path))
                    File.Create(path);
                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    Khoa temp = new Khoa
                    {

                        MaKhoa = int.Parse(parts[0]),
                        TenKhoa = parts[1],
                        NamThanhLap = int.Parse(parts[2]),


                    };
                    resurt.Add(temp);
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {
                return new List<BaseData>();
            }

        }


        public List<BaseData> ReadSinhVien(string path)
        {
            try
            {
                if (!File.Exists(path))
                    File.Create(path);
                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    SinhVien temp = new SinhVien
                    {

                        MSSV = parts[0],
                        TenSV = parts[1],
                        MaLop = parts[2],
                        NamVaoHoc = parts[3]


                    };
                    resurt.Add(temp);
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {

                return new List<BaseData>();

            }

        }
        public List<BaseData> ReadHocPhan(string path)
        {
            try
            {
                if (!File.Exists(path))
                    File.Create(path);
                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    HocPhan temp = new HocPhan
                    {
                        MaHocPhan = parts[0],
                        TenHocPhan = parts[1],
                        SoTC = int.Parse(parts[2]),
                        LoaiHP = parts[3],
                        HocKy = parts[4],
                        NamHoc = parts[5]

                    };
                    resurt.Add(temp);
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {
                return new List<BaseData>();
            }

        }

        public List<BaseData> ReadTaiKhoan(string path)
        {
            try
            {
                if (!File.Exists(path))
                    File.Create(path);
                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    TaiKhoan temp = new TaiKhoan
                    {
                        ID = int.Parse(parts[0]),
                        Username = parts[1],
                        Password = parts[2],
                        PhanQuyen = int.Parse(parts[3])

                    };
                    resurt.Add(temp);
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {
                return new List<BaseData>();
            }
        }
        public List<BaseData> ReadDKHP(string path)
        {
            try
            {
                bool kt = false;
                if (!File.Exists(path))
                    File.Create(path);
                List<BaseData> resurt = new List<BaseData>();

                //File.Open(path, FileMode.Open);
                var reader = File.OpenText(path);
                while (true)
                {
                    // Đọc 1 dòng
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line))
                        break;
                    // Tách thành các phần theo ký tự TAB
                    var parts = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    string ma = parts[0];
                    
                    string hk = parts[2];
                    string nh = parts[1];
                    DangKiHocPhan dkhp =(DangKiHocPhan)resurt.Find(x => (x as DangKiHocPhan).MaSV == ma && (x as DangKiHocPhan).HocKi == hk
                        && (x as DangKiHocPhan).NamHoc == nh);
                    if (dkhp == null || kt==false)
                    {
                        kt=true;
                        DangKiHocPhan temp = new DangKiHocPhan
                        {
                            MaSV = parts[0],
                        
                            HocKi = parts[2],
                            NamHoc = parts[1]
                           
                           
                        };
                        HocPhan hp=(HocPhan)QuanLiDSHocPhan.Instance.Find(x=>(x as HocPhan).MaHocPhan==parts[3])??new HocPhan();

                        temp.AddHocPhan(hp,float.Parse( parts[4]));

                        resurt.Add(temp);
                    }
                    else
                    {
                        HocPhan hp1=(HocPhan)QuanLiDSHocPhan.Instance.Find(x=>(x as HocPhan).MaHocPhan==parts[3])??new HocPhan();

                        dkhp.AddHocPhan(hp1, float.Parse(parts[4]));

                    }
                }
                reader.Close();
                return resurt;

            }
            catch (Exception)
            {
                return new List<BaseData>();
            }
        }
        public void WriteTo(string noidung, string path)
        {
            if (File.Exists(path))
                File.Delete(path);
            File.WriteAllText(path, noidung);
        }

    }
}
